﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;

namespace Studio7i.Persistencia
{
    public class ReservaInstrumentoDAO
    {

        // Métodos CRUD
        public ReservaInstrumento Crear(ReservaInstrumento reservaInstrumentoAcrear)
        {
            string _Sentencia = "INSERT INTO ReservaInstrumento(Codigo,CodReserva,CodInst) VALUES(@Codigo,@CodReserva,@CodInst)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@CodReserva", reservaInstrumentoAcrear.CodReserva));
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", reservaInstrumentoAcrear.CodInstrumento));

                    _Comando.ExecuteNonQuery();
                }
            }

            return Obtener(_NuevoCodigo);//Deberia devolver una lista de creados
            //return reservaInstrumentoAcrear;

        }

        public ReservaInstrumento Obtener(int codigo)
        {
            string _Sentencia = "SELECT Codigo,CodReserva,CodInst FROM ReservaInstrumento WHERE Codigo=@codigo";
            ReservaInstrumento reservaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            reservaEncontrada = new ReservaInstrumento();
                            reservaEncontrada.Codigo = _Resultado.GetInt32(0);
                            reservaEncontrada.CodReserva = (int)_Resultado["CodReserva"];
                            reservaEncontrada.CodInstrumento = (int)_Resultado["CodInst"];
                        }
                    }
                }
            }
            return reservaEncontrada;
        }

        public ReservaInstrumento Modificar(ReservaInstrumento reservaInstrumentoAModificar)
        {
            string _Sentencia = "UPDATE ReservaInstrumento SET CodReserva=@CodReserva,CodInst=@CodInst FROM ReservaInstrumento  WHERE Codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaInstrumentoAModificar.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CodReserva", reservaInstrumentoAModificar.CodReserva));
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", reservaInstrumentoAModificar.CodInstrumento));

                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(reservaInstrumentoAModificar.Codigo); 
            //return reservaInstrumentoAModificar;
        }

        public void Eliminar(ReservaInstrumento reservaInstrumentoAEliminar)
        {
            //string _Sentencia = "DELETE FROM ReservaInstrumento WHERE codReserva=@codigo";
            string _Sentencia = "Delete ReservaInstrumento where Codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaInstrumentoAEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<ReservaInstrumento> ListarTodos()
        {
            string _Sentencia = "SELECT Codigo,CodReserva,CodInst FROM ReservaInstrumento";
            ICollection<ReservaInstrumento> reservasEncontradas = new List<ReservaInstrumento>();
            ReservaInstrumento reservaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            reservaEncontrada = new ReservaInstrumento();

                            if (DBNull.Value.Equals(_Resultado["Codigo"])) // No hay datos en la tabla
                                reservaEncontrada.Codigo = 0;
                            else
                                reservaEncontrada.Codigo = (int)_Resultado["Codigo"];

                            if (DBNull.Value.Equals(_Resultado["CodReserva"])) // No hay datos en la tabla
                                reservaEncontrada.CodReserva = 0;
                            else
                                reservaEncontrada.CodReserva = (int)_Resultado["CodReserva"];

                            if (DBNull.Value.Equals(_Resultado["CodInst"])) // No hay datos en la tabla
                                reservaEncontrada.CodInstrumento = 0;
                            else
                                reservaEncontrada.CodInstrumento = (int)_Resultado["CodInst"];

                            reservasEncontradas.Add(reservaEncontrada);
                        }
                    }
                }
            }
            return reservasEncontradas;
        }

        public ICollection<ReservaInstrumento> ListarInstrumentosxReserva(Reserva reserva)
        {
            string _Sentencia = "SELECT CodInst FROM ReservaInstrumento WHERE CodReserva=@codigo";
            ICollection<ReservaInstrumento> instrumentosEncontrados = new List<ReservaInstrumento>();
            ReservaInstrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reserva.CodReserva));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new ReservaInstrumento();
                            instrumentoEncontrado.CodReserva = reserva.CodReserva;
                            if (DBNull.Value.Equals(_Resultado["CodInst"])) // No hay datos en la tabla
                                instrumentoEncontrado.CodInstrumento = 0;
                            else
                                instrumentoEncontrado.CodInstrumento = (int)_Resultado["CodInst"];

                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }

            return instrumentosEncontrados;
        }

        // Métodos de soporte*/
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(Codigo) FROM ReservaInstrumento";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}